# 从 flask 导入 Blueprint、request 和 jsonify，用于创建蓝图、处理请求和返回 JSON 响应
from flask import Blueprint, request, jsonify
# 从 flask_jwt_extended 导入 get_jwt_identity 和 jwt_required，用于处理 JWT 身份验证
from flask_jwt_extended import get_jwt_identity, jwt_required
# 从 app 导入数据库实例 db 和日志服务 LogService
from app import db, LogService
# 从 app.models.order_lib 导入生成订单的函数 generateOrder 和订单模型 Order
from app.models.order_lib import generateOrder, Order
# 从 presenter.order 导入订单展示器 OrderPresenter，用于将订单数据转换为适合展示的格式
from presenter.order import OrderPresenter
# 从 utils 导入创建响应的函数 create_response 和状态码类 StateCode
from utils import create_response, StateCode
# 从 utils.server 导入验证订单支付的函数 verifyOrderPayment
from utils.server import verifyOrderPayment

# 创建一个名为 'order' 的蓝图
order_bp = Blueprint('order', __name__)

@order_bp.route('/orders', methods=['POST'])
@jwt_required()
def createOrder():
    """
    创建新订单的路由处理函数。

    该函数接收一个 POST 请求，使用当前用户的身份和请求中的数据生成新订单，
    将订单保存到数据库，记录日志，并返回包含订单信息的成功响应。

    Returns:
        tuple: 包含 JSON 响应和 HTTP 状态码 200 的元组。
    """
    # 获取当前用户的身份信息
    current_user = get_jwt_identity()
    # 获取请求中的 JSON 数据
    data = request.json
    # 根据请求数据和当前用户生成新订单
    new_order = generateOrder(data, current_user)
    # 将新订单添加到数据库会话
    db.session.add(new_order)
    # 提交数据库会话，将新订单保存到数据库
    db.session.commit()
    # 使用订单展示器将订单数据转换为适合展示的字典格式
    order_presenter = OrderPresenter(new_order).as_dict()
    # 记录日志
    LogService.log()
    # 返回包含成功状态码和订单信息的 JSON 响应，状态码为 200
    return jsonify(create_response(StateCode.SUCCESS, data=order_presenter)), 200

@order_bp.route('/orders/<string:order_no>/query_payment', methods=['POST'])
@jwt_required()
def queryPayment(order_no):
    """
    查询订单支付状态的路由处理函数。

    该函数接收一个 POST 请求，包含订单编号，验证订单支付状态，
    如果支付成功，更新订单状态，记录日志，并返回包含订单信息的成功响应；
    如果支付失败，记录日志并返回包含错误状态码的响应。

    Args:
        order_no (str): 要查询的订单编号。

    Returns:
        tuple: 包含 JSON 响应和 HTTP 状态码的元组。
    """
    # 获取当前用户的身份信息
    current_user = get_jwt_identity()
    # 验证订单支付状态
    response = verifyOrderPayment(order_no)
    # 检查响应状态码是否为 200 且支付状态为成功
    if response.status_code == 200 and response.json().get("data")["state"] == "successful":
        # 如果支付成功，更新订单状态和支付时间
        order = Order.setOrderState(order_no, current_user,
                                    state=1, payment_time=response.json().get("data")["pay_time"])
        # 使用订单展示器将订单数据转换为适合展示的字典格式
        order_presenter = OrderPresenter(order).as_dict()
        # 记录日志
        LogService.log()
        # 返回包含成功状态码和订单信息的 JSON 响应，状态码为 200
        return jsonify(create_response(StateCode.SUCCESS, data=order_presenter)), 200
    else:
        # 如果支付失败，记录日志
        LogService.log()
        # 返回包含订单支付错误状态码的 JSON 响应，状态码为 400
        return jsonify(create_response(StateCode.ORDER_PAY_ERROR)), 400

@order_bp.route('/orders', methods=['GET'])
@jwt_required()
def queryOrder():
    """
    查询订单的路由处理函数。

    该函数接收一个 GET 请求，根据请求参数中的订单状态和当前用户的身份信息，
    从数据库中查询符合条件的订单，将订单数据转换为适合展示的格式，
    记录日志，并返回包含订单信息的成功响应。

    Returns:
        tuple: 包含 JSON 响应和 HTTP 状态码 200 的元组。
    """
    # 获取请求参数中的订单状态
    state = request.args.get("state")
    # 获取当前用户的身份信息
    current_user = get_jwt_identity()
    # 从数据库中查询符合条件的订单
    orders = Order.query.filter(Order.passenger_id == current_user, Order.state == state).all()
    # 使用订单展示器将订单数据转换为适合展示的字典列表
    order_presenter = [OrderPresenter(order).as_dict() for order in orders]
    # 记录日志
    LogService.log()
    # 返回包含成功状态码和订单信息的 JSON 响应，状态码为 200
    return jsonify(create_response(StateCode.SUCCESS, data=order_presenter)), 200